使用opencore_amr实现wav转amr(8khz,16khz)

由于公司正在做声纹方面的开发,所以需要对语音数据做压缩,目前想到了三种压缩方式,1是AMR,2是Speex,3是Opus,这里先说第一种方式,在iOS4.0之前是可以进行amr格式的录音的,后来苹果取消了这个声音格式,但是可以使用opencore-amr来将wav格式转换为amr格式。

目前网上的例子大多数都是8Khz采样率的wav文件转AMR,具体可以参照iOS音频格式之AMR和WAV互转(更新支持64位),这里也要感谢这篇博文的作者黄俊鹏,他给我提供了帮助我才找到了方法。但是我们公司由于对于声音采集样本的要求比较高,所以我们要使用16Khz的采样率,那么问题就出现了,在opencore-amr中并没有提供amr-wb的encode方法,8kHZ使用的opencore-amrnb.a的静态库,其中提供了encode和decode的方法,但是对于16Khz使用的是opencore-amrwb的静态库,其中里面只提供了decode的方法,后来通过其他资料我我才明白encode在另外一个项目vo-amrwbenc里面,如果要使用的话必须要单独编译这个项目才可以,项目下载可以看opencore-amr,所以如果需要将16Khz wav文件转为amr文件,只需要编译这个库然后使用就可以了,如果要解码那么还是需要使用原来的opencore-amr库。

#下面就可以编译vo-amrwebenc

1.首先新建一个文件夹,将下载到的vo-amrwbenc-0.1.3.tar.gz压缩包放到里面(有可能下载下来的不一定是这个版本,因为这个库会更新,所以下面的命令也要跟着改变VERSION为对应的下载的压缩包的版本),然后进入这个文件夹,在里面创建build.sh文件,将以下脚本粘贴到文件里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/sh

set -xe

# 注意这里需要改为下载下来的压缩包的版本
VERSION="0.1.3"

LIBSRCNAME="vo-amrwbenc"

CURRENTPATH=`pwd`

mkdir -p "${CURRENTPATH}/src"

# 下载压缩包的后缀有可能是tar不一定是tar.gz,下面也要根据情况修改
tar zxvf ${LIBSRCNAME}-${VERSION}.tar.gz -C "${CURRENTPATH}/src"

cd "${CURRENTPATH}/src/${LIBSRCNAME}-${VERSION}"

# 设置环境变量并创建lib-ios文件夹,后续生成的.a类库都会放在这个文件夹里边

DEST="${CURRENTPATH}/lib-ios"

mkdir -p "${DEST}"

ARCHS="armv7 armv7s arm64 i386 x86_64"

LIBS="libvo-amrwbenc.a"

for arch in $ARCHS; do

case $arch in arm*)

IOSV="-miphoneos-version-min=7.0"

if [ $arch == "arm64" ]

then

IOSV="-miphoneos-version-min=7.0"

fi

echo "Building for iOS $arch ****************"

# 编译 $arch 环境的类库(amr类型类型)

SDKROOT="$(xcrun --sdk iphoneos --show-sdk-path)"

CC="$(xcrun --sdk iphoneos -f clang)"

CXX="$(xcrun --sdk iphoneos -f clang++)"

CPP="$(xcrun -sdk iphonesimulator -f clang++)"

CFLAGS="-isysroot $SDKROOT -arch $arch $IOSV -isystem $SDKROOT/usr/include -fembed-bitcode"

CXXFLAGS=$CFLAGS

CPPFLAGS=$CFLAGS

export CC CXX CFLAGS CXXFLAGS CPPFLAGS

./configure \

--host=arm-apple-darwin \

--prefix=$DEST \

--disable-shared --enable-static

;;

*)

IOSV="-mios-simulator-version-min=7.0"

echo "Building for iOS $arch*****************"

SDKROOT=`xcodebuild -version -sdk iphonesimulator Path`

CC="$(xcrun -sdk iphoneos -f clang)"

CXX="$(xcrun -sdk iphonesimulator -f clang++)"

CPP="$(xcrun -sdk iphonesimulator -f clang++)"

CFLAGS="-isysroot $SDKROOT -arch $arch $IOSV -isystem $SDKROOT/usr/include -fembed-bitcode"

CXXFLAGS=$CFLAGS

CPPFLAGS=$CFLAGS

export CC CXX CFLAGS CXXFLAGS CPPFLAGS

./configure \

--prefix=$DEST \

--disable-shared

;;

esac

make > /dev/null

make install

make clean

for i in $LIBS; do

mv $DEST/lib/$i $DEST/lib/$i.$arch

done

done

for i in $LIBS; do

input=""

for arch in $ARCHS; do

input="$input $DEST/lib/$i.$arch"

done

lipo -create -output $DEST/lib/$i $input

done

##2.修改build.sh的权限,打开终端,cd到新建的文件夹,使用命令 chmod 777 build.sh 修改权限。

##3.修改完成之后在终端执行 ./build.sh 就会在vo-amrwbenc里面生成一个lib-ios文件夹,里面就包含了libvo-amrwbenc.a的静态库和enc_if_h的头文件。

最后我已经将编译好的项目放到github上面

vo-amrwbenc编译

4.更新

——————-2018.8.16更新———————————————
今天有收到issues说编码的效率很慢,然后需要更新open-amr的库然后重新编译,大家需要到opencore-amr下载最新的库,然后重新编译打包静态库,下面附上打包脚本,打包方法和上面一致。同时记得要改一下脚本里面压缩报的版本和压缩后缀。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

#!/bin/sh
set -xe

VERSION="0.1.3"
SDKVERSION="8.4"
LIBSRCNAME="opencore-amr"

CURRENTPATH=`pwd`

mkdir -p "${CURRENTPATH}/src"
tar zxvf ${LIBSRCNAME}-${VERSION}.tar.gz -C "${CURRENTPATH}/src"
cd "${CURRENTPATH}/src/${LIBSRCNAME}-${VERSION}"

DEVELOPER=`xcode-select -print-path`
DEST="${CURRENTPATH}/lib-ios"
mkdir -p "${DEST}"

ARCHS="armv7 armv7s arm64 i386 x86_64"
# ARCHS="armv7"
LIBS="libopencore-amrnb.a libopencore-amrwb.a"

DEVELOPER=`xcode-select -print-path`

for arch in $ARCHS; do
case $arch in
arm*)

IOSV="-miphoneos-version-min=7.0"
if [ $arch == "arm64" ]
then
IOSV="-miphoneos-version-min=7.0"
fi

echo "Building for iOS $arch ****************"
SDKROOT="$(xcrun --sdk iphoneos --show-sdk-path)"
CC="$(xcrun --sdk iphoneos -f clang)"
CXX="$(xcrun --sdk iphoneos -f clang++)"
CPP="$(xcrun -sdk iphonesimulator -f clang++)"
CFLAGS="-isysroot $SDKROOT -arch $arch $IOSV -isystem $SDKROOT/usr/include -fembed-bitcode"
CXXFLAGS=$CFLAGS
CPPFLAGS=$CFLAGS
export CC CXX CFLAGS CXXFLAGS CPPFLAGS

./configure \
--host=arm-apple-darwin \
--prefix=$DEST \
--disable-shared --enable-static
;;
*)
IOSV="-mios-simulator-version-min=7.0"
echo "Building for iOS $arch*****************"

SDKROOT=`xcodebuild -version -sdk iphonesimulator Path`
CC="$(xcrun -sdk iphoneos -f clang)"
CXX="$(xcrun -sdk iphonesimulator -f clang++)"
CPP="$(xcrun -sdk iphonesimulator -f clang++)"
CFLAGS="-isysroot $SDKROOT -arch $arch $IOSV -isystem $SDKROOT/usr/include -fembed-bitcode"
CXXFLAGS=$CFLAGS
CPPFLAGS=$CFLAGS
export CC CXX CFLAGS CXXFLAGS CPPFLAGS
./configure \
--prefix=$DEST \
--disable-shared
;;
esac
make > /dev/null
make install
make clean
for i in $LIBS; do
mv $DEST/lib/$i $DEST/lib/$i.$arch
done
done

for i in $LIBS; do
input=""
for arch in $ARCHS; do
input="$input $DEST/lib/$i.$arch"
done
lipo -create -output $DEST/lib/$i $input
done
-------评论系统采用disqus,如果看不到需要翻墙-------------